// 进度条相关配置
package progress

import (
	"time"

	"gitee.com/xiaoyutab/xgotool/individual/xqueue"
	"gitee.com/xiaoyutab/xgotool/xnum"
)

// Progress 进度条结构体
type Progress struct {
	Key       string  `json:"key"`        // 进度条标识【前/后端生成一个随机串作为key】
	Name      string  `json:"name"`       // 进度条名称/备注
	Total     int     `json:"total"`      // 总数
	Current   int     `json:"current"`    // 当前进度
	Pct       float64 `json:"pct"`        // 进度百分比
	StartTime int64   `json:"start_time"` // 开始时间
	EndTime   int64   `json:"end_time"`   // 结束时间
}

// 当前维持的进度条列表
// 已完成的进度条会被移除
var progressList []*Progress = []*Progress{}

// 创建进度条
//
//	key		进度条标识【前/后端生成一个随机串作为key】
//	total	总数
func New(key string, total int) *Progress {
	p := Progress{
		Key:       key,
		Total:     total,
		StartTime: time.Now().Unix(),
	}
	defer xqueue.Set("hook.progress.clean", p)
	for _, v := range progressList {
		if v.Key == key {
			return v
		}
	}
	// 添加到列表中去
	progressList = append(progressList, &p)
	return &p
}

// 进度条更新（1个）（此操作不会导致进度条完成，需手动调用done进行完成）
//
//	name	当前进度提示
func (p *Progress) Add(name string) *Progress {
	return p.AddNum(1, name)
}

// 进度条更新（此操作不会导致进度条完成，需手动调用done进行完成）
//
//	num		跨越进度数量
//	name	当前进度提示
func (p *Progress) AddNum(num int, name string) *Progress {
	defer xqueue.Set("hook.progress.clean", p)
	p.Current += num
	p.Name = name
	if p.Current >= p.Total {
		p.Current = p.Total - 1
	}
	p.Pct = xnum.PriceHalf(float64(p.Current) / float64(p.Total) * 100)
	if p.Pct > 99.9 {
		p.Pct = 99.9
	}
	return p
}

// 进度条完结
func (p *Progress) Done() *Progress {
	defer xqueue.Set("hook.progress.clean", p)
	p.Name = "已完成"
	p.Current = p.Total
	p.Pct = 100
	p.EndTime = time.Now().Unix()
	return p
}

// 移除某进度条
func Remove(key string) {
	for i := 0; i < len(progressList); i++ {
		if progressList[i].Key == key {
			progressList = append(progressList[:i], progressList[i+1:]...)
			break
		}
	}
}

// 获取所有进度条列表
func List() []*Progress {
	return progressList
}
